package ynu.edu.elmspringboot.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页查询结果封装类
 * 适配 MyBatis-Plus 3.4.2 版本
 * @param <T> 数据类型
 */
@Data
@ApiModel(description = "分页查询结果")
public class PageResult<T> {

    @ApiModelProperty("数据列表")
    private List<T> records;

    @ApiModelProperty("总记录数")
    private long total;

    @ApiModelProperty("当前页码")
    private long current;

    @ApiModelProperty("每页大小")
    private long size;

    @ApiModelProperty("总页数")
    private long pages;

    @ApiModelProperty("是否有下一页")
    private boolean hasNext;

    @ApiModelProperty("是否有上一页")
    private boolean hasPrevious;

    /**
     * 从MyBatis-Plus的IPage转换为PageResult
     * @param page MyBatis-Plus分页结果
     * @param <T> 数据类型
     * @return PageResult对象
     */
    public static <T> PageResult<T> fromIPage(IPage<T> page) {
        PageResult<T> result = new PageResult<>();
        result.setRecords(page.getRecords());
        result.setTotal(page.getTotal());
        result.setCurrent(page.getCurrent());
        result.setSize(page.getSize());
        result.setPages(page.getPages());
        
        // 手动计算是否有下一页和上一页
        result.setHasNext(page.getCurrent() < page.getPages());
        result.setHasPrevious(page.getCurrent() > 1);
        
        return result;
    }

    /**
     * 创建空的分页结果
     * @param <T> 数据类型
     * @return 空的分页结果
     */
    public static <T> PageResult<T> empty() {
        PageResult<T> result = new PageResult<>();
        result.setRecords(new ArrayList<>());
        result.setTotal(0);
        result.setCurrent(1);
        result.setSize(10);
        result.setPages(0);
        result.setHasNext(false);
        result.setHasPrevious(false);
        return result;
    }

    /**
     * 创建分页结果（手动设置所有参数）
     * @param records 数据列表
     * @param total 总记录数
     * @param current 当前页码
     * @param size 每页大小
     * @param <T> 数据类型
     * @return PageResult对象
     */
    public static <T> PageResult<T> of(List<T> records, long total, long current, long size) {
        PageResult<T> result = new PageResult<>();
        result.setRecords(records != null ? records : new ArrayList<>());
        result.setTotal(total);
        result.setCurrent(current);
        result.setSize(size);
        
        // 计算总页数
        long pages = size > 0 ? (total + size - 1) / size : 0;
        result.setPages(pages);
        
        // 计算是否有下一页和上一页
        result.setHasNext(current < pages);
        result.setHasPrevious(current > 1);
        
        return result;
    }

    /**
     * 获取当前页的起始索引（用于数据库查询）
     * @return 起始索引
     */
    public long getOffset() {
        return (current - 1) * size;
    }

    /**
     * 获取当前页的结束索引（用于数据库查询）
     * @return 结束索引
     */
    public long getLimit() {
        return size;
    }

    /**
     * 检查是否为第一页
     * @return 是否为第一页
     */
    public boolean isFirst() {
        return current == 1;
    }

    /**
     * 检查是否为最后一页
     * @return 是否为最后一页
     */
    public boolean isLast() {
        return current >= pages;
    }

    /**
     * 获取下一页页码
     * @return 下一页页码，如果没有下一页则返回当前页
     */
    public long getNextPage() {
        return hasNext ? current + 1 : current;
    }

    /**
     * 获取上一页页码
     * @return 上一页页码，如果没有上一页则返回当前页
     */
    public long getPreviousPage() {
        return hasPrevious ? current - 1 : current;
    }

    /**
     * 获取当前页的记录数
     * @return 当前页的记录数
     */
    public int getCurrentPageSize() {
        return records != null ? records.size() : 0;
    }

    /**
     * 检查是否有数据
     * @return 是否有数据
     */
    public boolean hasData() {
        return records != null && !records.isEmpty();
    }

    /**
     * 获取总页数（如果总记录数为0，返回1）
     * @return 总页数
     */
    public long getTotalPages() {
        return total > 0 ? pages : 1;
    }

    /**
     * 获取分页信息摘要
     * @return 分页信息摘要字符串
     */
    public String getPageInfo() {
        return String.format("第%d页，共%d页，每页%d条，共%d条记录", 
                current, pages, size, total);
    }

    /**
     * 检查分页参数是否有效
     * @return 分页参数是否有效
     */
    public boolean isValid() {
        return current > 0 && size > 0 && total >= 0;
    }
} 